from sqlalchemy import Integer

from easyRead.extensions import db
from flask import Flask, jsonify
import os
from collections import OrderedDict


class EntityBase(object):  # 在db.Model后面加上这个能够使对象序列化为JSON
    def to_json(self):
        fields = self.__dict__
        if "_sa_instance_state" in fields:
            del fields["_sa_instance_state"]
        return fields


class State:
    TAKEN = u'已取'
    NOT_TAKEN = u'未取'
    LEND = u'借出'
    NOT_LEND = u'未借出'
    EXAMINE_IN = u'审核中'
    EXAMINE_APPROVED = u'审核通过'
    EXAMINE_FAILED = u'审核未通过'


# 定义数据库models
class User(db.Model, EntityBase):  # 读者基本信息
    __tablename__ = 'userinfo'

    id = db.Column(db.String(255), primary_key=True)  # 学工号
    password = db.Column(db.String(255))  # 密码
    nickname = db.Column(db.String(255))  # 昵称
    email = db.Column(db.String(255))  # 邮箱
    phone = db.Column(db.String(255))  # 电话号码
    level = db.Column(db.String(255))  # 权限等级（学生不能借超过6本书，老师不能借超过10本书）student:学生 teacher:老师 admin:普通管理员
    faceDetection = db.Column(db.Boolean())

    def __init__(self, id, password=None, nickname=None, email=None, phone=None, level=None, faceDetection=0):
        self.id = id
        self.password = password
        self.nickname = nickname
        self.email = email
        self.phone = phone
        self.level = level
        self.faceDetection = faceDetection


class Debt(db.Model):  # 读者欠费表
    __tablename__ = 'debt'

    userid = db.Column(db.String(255), primary_key=True)  # 读者id
    number = db.Column(db.Double)  # 欠费金额


class QRcode(db.Model):  # 读者申请借阅该书后，生成二维码等待读者领取的表，生成该表时表示图书被预定，该书库存减1
    __tablename__ = 'QRcode'

    book_id = db.Column(db.String(255), primary_key=True)  # 书的id
    borrower_id = db.Column(db.String(255), primary_key=True)  # 借阅者id
    QR_code = db.Column(db.String(255))  # 二维码
    state = db.Column(db.String(255))  # 未取，已取，未取时读者扫码领取此书，已取时管理员扫码归还此书
    time = db.Column(db.String(255))  # 码生成时间

    def __init__(self, book_id, borrower_id, QR_code, state, time):
        self.book_id = book_id
        self.borrower_id = borrower_id
        self.QR_code = QR_code
        self.state = state
        self.time = time


class UserBook(db.Model, EntityBase):  # 用户借出去的书，每本书算作独立的一个对象
    __tablename__ = 'user_books'

    id = db.Column(db.String(255), primary_key=True)  # unique,用 拥有者id+上传时间 生成
    owner = db.Column(db.String(255))  # 拥有者
    image = db.Column(db.String(255))  # 书的封面图片
    name = db.Column(db.String(255))  # 书的名字
    author = db.Column(db.String(255))  # 作者
    publisher = db.Column(db.String(255))  # 出版社
    publication_date = db.Column(db.String(255))  # 出版时间
    introduction = db.Column(db.String(255))  # 书的简介
    pages = db.Column(db.Integer)  # 页数
    keywords = db.Column(db.String(255))  # 标签，关键词
    recommend_reason = db.Column(db.String(255))  # 推荐理由，作者的评价等，可填可不填
    state = db.Column(db.String(255))  # 书的状态，借出或未借出
    iSBN = db.Column(db.String(255))  # 索书号
    earning = db.Column(db.Double)  # 借阅该书时需要付给书的拥有者的费用
    price = db.Column(db.Double)  # 书的价格，丢失后索赔数目
    borrow_times = db.Column(db.Integer)  # 书的借阅次数


class UserBookToExamine(db.Model):  # 用户上传自己要借出去的书，进入审核表，审核通过进入UserBook表
    __tablename__ = 'user_books_examine'

    id = db.Column(db.String(255), primary_key=True)  # 书的id
    owner = db.Column(db.String(255))  # 拥有者
    image = db.Column(db.String(255))  # 书的封面图片
    name = db.Column(db.String(255))  # 书的名字
    author = db.Column(db.String(255))  # 作者
    publisher = db.Column(db.String(255))  # 出版社
    publication_date = db.Column(db.String(255))  # 出版时间
    introduction = db.Column(db.String(255))  # 书的简介
    pages = db.Column(db.Integer)  # 页数
    keywords = db.Column(db.String(255))  # 标签，关键词
    recommend_reason = db.Column(db.String(255))  # 推荐理由，作者的评价等，可填可不填
    state = db.Column(db.String(255))  # 书的审核状态，审核中、审核通过、审核不通过
    iSBN = db.Column(db.String(255))  # 索书号
    earning = db.Column(db.Double)  # 借阅该书时需要付给书的拥有者的费用
    price = db.Column(db.Double)  # 书的价格，丢失后索赔数目
    borrow_times = db.Column(db.Integer)  # 书的借阅次数
    reject_reason = db.Column(db.String(255))  # 审核不通过的理由
    apply_time = db.Column(db.String(255))  # 审核申请时间，一定时间后将审核过的图书从表中删除


class BorrowingUserBook(db.Model):  # 借阅读者的书,记录 借阅者与正被借阅的书 的关系，在二维码被读者扫描时为借阅时间
    __tablename__ = 'borrowing_user_books'

    book_id = db.Column(db.String(255), primary_key=True)  # 书的id
    borrower_id = db.Column(db.String(255))  # 借阅者id
    time = db.Column(db.String(255))  # 借阅时间


class LibraryBook(db.Model, EntityBase):  # 图书馆的书，相同的书算作一个对象
    __tablename__ = 'library_book'
    id = db.Column(db.String(255), primary_key=True)  # unique
    image = db.Column(db.String(255))  # 书的封面
    name = db.Column(db.String(255))  # 书的名字
    author = db.Column(db.String(255))  # 作者
    publisher = db.Column(db.String(255))  # 出版社
    publication_date = db.Column(db.String(255))  # 出版时间
    introduction = db.Column(db.String(255))  # 书的简介
    pages = db.Column(db.Integer)  # 页数
    keywords = db.Column(db.String(255))  # 标签，关键词
    iSBN = db.Column(db.String(255))  # 索书号
    price = db.Column(db.Double)  # 书的价格，丢失后索赔数目
    borrow_times = db.Column(db.Integer)  # 近30天借阅次数，这个数据如何处理留待稍后讨论
    number = db.Column(db.Integer)  # 馆藏余量
    borrow_num = db.Column(db.Integer)  # 借走的数量

    def __init__(self, id, image=None, name=None, author=None, publisher=None, publication_date=None, introduction=None,
                 pages=None, keywords=None, iSBN=None, price=None, borrow_times=None, number=None, borrow_num=None):
        self.id = id
        self.image = image
        self.name = name
        self.author = author
        self.publisher = publisher
        self.publication_date = publication_date
        self.introduction = introduction
        self.pages = pages
        self.keywords = keywords
        self.iSBN = iSBN
        self.price = price
        self.borrow_times = borrow_times
        self.number = number
        self.borrow_num = borrow_num


class BorrowingLibraryBook(db.Model):  # 借阅图书馆的书，记录借阅者和正被借阅的书的信息，在二维码被读者扫描时为借阅时间
    __tablename__ = 'borrowing_library_books'

    id = db.Column(Integer, primary_key=True, autoincrement=True)  # 序号，设置为自增长主键
    book_id = db.Column(db.String(255))  # 书的id
    borrower_id = db.Column(db.String(255))  # 借阅者id
    time = db.Column(db.String(255))  # 借阅时间

    def __init__(self, book_id, borrower_id, time):
        self.book_id = book_id
        self.borrower_id = borrower_id
        self.time = time


class BorrowingHistory(db.Model):  # 借阅历史记录
    __tablename__ = 'borrowing_history'
    id = db.Column(Integer, primary_key=True, autoincrement=True)  # unique，设置为自增长主键
    book_id = db.Column(db.String(255))  # 书的id
    borrower_id = db.Column(db.String(255))  # 借书人的id
    borrow_time = db.Column(db.String(255))  # 借出时间
    return_time = db.Column(db.String(255))  # 归还时间

    def __init__(self, book_id, borrower_id, borrow_time, return_time):
        self.book_id = book_id
        self.borrower_id = borrower_id
        self.borrow_time = borrow_time
        self.return_time = return_time


class SystemAnnouncement(db.Model):  # 系统公告
    __tablename__ = 'system_announcement'

    id = db.Column(db.String(255), primary_key=True)  # 公告编号，自增？
    topic = db.Column(db.String(255))  # 公告标题
    content = db.Column(db.String(255))  # 公告内容
    time = db.Column(db.String(255))  # 公告发出时间


class LetterFromUser(db.Model):  # 用户来信
    __tablename__ = 'letters_from_user'

    id = db.Column(db.String(255), primary_key=True)  # 来信编号，自增？
    username = db.Column(db.String(255))  # 用户，可以匿名
    topic = db.Column(db.String(255))  # 来信标题
    content = db.Column(db.String(255))  # 来信内容
    reply = db.Column(db.String(255))  # 回复内容
    time = db.Column(db.String(255))  # 来信时间


class ConsultationFromUser(db.Model):  # 用户咨询
    __tablename__ = 'consultation_from_user'

    id = db.Column(db.String(255), primary_key=True)  # 咨询编号，自增？
    username = db.Column(db.String(255))  # 用户，可以匿名
    topic = db.Column(db.String(255))  # 咨询标题
    content = db.Column(db.String(255))  # 咨询内容
    reply = db.Column(db.String(255))  # 回复内容
    time = db.Column(db.String(255))  # 咨询时间
